<?php

class Application_Model_Lecturas extends Sgit_Model
{  
    protected $_name = 'lecturas';
    protected $_primary = 'id';


    
   public function _getConsumos($id,$where=array(),$limit=20)
   {

        $mes_consumo     = new Zend_Db_Expr("MONTH(SUBDATE(DATE_FORMAT(concat(anio,'-',mes,'-10'), '%Y-%m-%d'),  INTERVAL 1 MONTH))");
        $anio_consumo    = new Zend_Db_Expr("YEAR(SUBDATE(DATE_FORMAT(concat(anio,'-',mes,'-10'), '%Y-%m-%d'),  INTERVAL 1 MONTH))");
        
        $mes_consumo_anterior     = new Zend_Db_Expr("MONTH(SUBDATE(DATE_FORMAT(concat(anio,'-',mes,'-10'), '%Y-%m-%d'),  INTERVAL 2 MONTH))");
        $anio_consumo_anterior    = new Zend_Db_Expr("YEAR(SUBDATE(DATE_FORMAT(concat(anio,'-',mes,'-10'), '%Y-%m-%d'),  INTERVAL 2 MONTH))");
        
        $lectura_anterior = new Zend_Db_Expr("(SELECT l2.cantidad FROM lecturas as l2 WHERE id_con=lecturas.id_con AND l2.mes=mes_consumo AND l2.anio=anio_consumo)");
        $lectura_anterior_2 = new Zend_Db_Expr("(SELECT l2.cantidad FROM lecturas as l2 WHERE id_con=lecturas.id_con AND l2.mes=mes_consumo_anterior AND l2.anio=anio_consumo_anterior)");

        $select=$this->getAdapter()
            ->select()
            ->from(array($this->_name),array('id_con','cantidad','f_lectura','anio','mes','mes_consumo'=>$mes_consumo,'anio_consumo'=>$anio_consumo,'mes_consumo_anterior'=>$mes_consumo_anterior,'anio_consumo_anterior'=>$anio_consumo_anterior,/*'consumo'=>$cantidad,'consumo_anterior'=>$cantidad_anterior,*/'lectura_anterior'=>$lectura_anterior,'lectura_anterior_2'=>$lectura_anterior_2))
            ->order(array("anio desc","mes desc" ));
        
        


        if (is_array($id) || is_numeric($id))
            $select->where("{$this->_name}.id_con IN (?)", $id);
        
        
       
        
        foreach($where as $k => $v)
        {
            $select->where($k,$v);
        }
   

        if($limit)
        {
            $fecha=new Zend_Date();
            $fecha->setDay(1)->subMonth($limit+1);
            $select->where("DATE_FORMAT(concat(anio,'-',mes,'-01'), '%Y-%m-%d') >= ?",$fecha->get('yyyy-MM-dd'));
        }


        $consumos = $this->getAdapter()->fetchAll($select); 

        $consumos=$this->assocArray($consumos,'id_con');
        
       
        return $consumos;
   }
   
    
   public function getConsumos($id,$where=array(),$limit=20)
   {

        $rows= $this->_getConsumos($id,$where,$limit);
    
        foreach($rows as $id_con => $lecturas_contador)
        {
            foreach($lecturas_contador as $v)
            {
                
                $k=$v['anio'].str_pad($v['mes'],2,'0',STR_PAD_LEFT);
                $lectura['mes']= $v['mes'];
                $lectura['mes_consumo']=$v['mes_consumo'];
                $lectura['mes_consumo_anterior']= $v['mes_consumo_anterior'];
                $lectura['anio']= $v['anio'];
                $lectura['anio_consumo']=$v['anio_consumo'];
                $lectura['anio_consumo_anterior']= $v['anio_consumo_anterior'];
                
                $lectura['lectura']=$v['cantidad'];
                $lectura['lectura_anterior']=$v['lectura_anterior'];
                $lectura['lectura_anterior_2']=$v['lectura_anterior_2'];
                
                if(!is_null($lectura['lectura_anterior'])){
                    $lectura['consumo']=$lectura['lectura'] - $lectura['lectura_anterior'];
                }else{
                    $lectura['consumo']=0;
                }
                
                if(!is_null($lectura['lectura_anterior_2'])){
                    $lectura['consumo_anterior']=$lectura['lectura_anterior'] - $lectura['lectura_anterior_2'];
                }else{
                    $lectura['consumo_anterior']=0;
                }
         
                $date=mktime(0,0,0,$v['mes'],15,$v['anio']);
                $date2=mktime(0,0,0,$v['mes_consumo'],15,$v['anio_consumo']);
                $lectura['date_consumo']=$date;
                $lectura['date_consumo_anterior']=$date2;
                
                
                $lectura['horas_mes_consumo']=date('t',$date)*24;
                $lectura['horas_mes_consumo_anterior']=date('t',$date2)*24;
                
                $lectura['potencia']=round($lectura['consumo']/$lectura['horas_mes_consumo'],4);
                $lectura['potencia_anterior']=round($lectura['consumo_anterior']/$lectura['horas_mes_consumo_anterior'],4);
                if($lectura['potencia_anterior'])$lectura['incremento_potencia']=round(100*($lectura['potencia']-$lectura['potencia_anterior']) / $lectura['potencia_anterior'],4);
                
                $salida[$id_con][$k]=$lectura;
            }
        }
 
        
        if(is_numeric($id)){
            return $salida[$id];
        }else{
            return $salida;
        }
        
   }
   
   
   public function getConsumo($id,$anio=null,$mes=null,$limit=20)
   {
        if($anio){
            $fecha=new Zend_Date();
            $fecha->setDay(1)->setYear($anio);
            if($mes)
                $fecha->setMonth($mes);
                
            $fecha->subMonth(1);
            
            $where['anio = ?']=$fecha->get('M');
            $where['mes = ?']=$mes->get('yyyy');
        }

        $rows= $this->getConsumos($id,$where,1);


        //cojo solo la primera fila
        if(is_array($id)){
            foreach($rows as $id_con=>$v)
            {
               $filas[$id_con]=@array_shift($v);;
            }
            return $filas;
        }else{
            return @array_shift($rows);;
        }
        
   }
   
   
   function consumoProyecto($id_proyecto,$mes,$anio)
   {
    
          $f=new Zend_Date();
          $f->setDay(1)->set($anio,Zend_Date::YEAR)->set($mes,Zend_Date::MONTH);
          
          
          $select_actual=$this->getAdapter()->select();
          $select_actual->from($this->_name,array(new Zend_Db_Expr('SUM(cantidad)')))
                ->joinLeft('contadores', 'contadores.id = lecturas.id_con',array(''))
                ->where('mes = ?',$f->get(Zend_Date::MONTH_SHORT),INTEGER)
                ->where('anio = ?',$f->get(Zend_Date::YEAR),INTEGER)
                ->where('activo = ?',1)
                //->where("(contadores.f_alta < '".$f->toString('yyyy-MM-ddd')."' OR contadores.f_alta IS NULL)")
                ->where('id_proyecto = ?',$id_proyecto,INTEGER);
                
   
          $f->sub(1,Zend_Date::MONTH);  
          
       
          
          $select_anterior=$this->getAdapter()->select();
          $select_anterior->from($this->_name,array(new Zend_Db_Expr('SUM(cantidad)')))
                ->joinLeft('contadores', 'contadores.id = lecturas.id_con',array(''))
                ->where('mes = ?',$f->get(Zend_Date::MONTH_SHORT),INTEGER)
                ->where('anio = ?',$f->get(Zend_Date::YEAR),INTEGER)
                ->where('activo = ?',1)
                //->where("(contadores.f_alta < '".$f->toString('yyyy-MM-ddd')."' OR contadores.f_alta IS NULL)")
                ->where('id_proyecto = ?',$id_proyecto,INTEGER);
                 
          $sql="SELECT IFNULL (($select_actual),0) - IFNULL(($select_anterior),0)"; 


          $select=$this->getAdapter()->select();  
          $select->from('',array(new Zend_Db_Expr("IFNULL (($select_actual),0) - IFNULL(($select_anterior),0)")));
          
          $consumo = $this->getAdapter()->fetchOne($select);     

          return round($consumo,4);

   }
   
   
   
   
    private function actualizarLecturasContadoresInactivos($idZona, $mes_imputacion, $anio_imputacion)
    {
        
        $fecha=new Zend_Date();
        $fecha->setDay(1)->setMonth($mes_imputacion)->setYear($anio_imputacion);
        $fecha->subMonth(2);

        $contadores=new Application_Model_Contadores();
        $contadores_inactivos = $contadores->getAll(array('id_zona=?'=>$idZona,'activo = '=>0));
        
        $mes=$fecha->get('M');
        $anio=$fecha->get('YYYY');
        
        foreach ($contadores_inactivos as $v) 
        {
            $select_actual=$this->getAdapter()->select();
            $select->from($this->_name,array('cantidad'))
                ->where('id_con = ?',$v['id'],INTEGER)
                ->order(array('anio DESC','mes DESC'))
                ->limit(1);
              
            $ultima_lectura = $this->getAdapter()->fetchOne($select);   

            if (!empty($ultima_lectura)) 
            {
                $keys ['id_con']=$v['id'];
                $keys ['mes']=$mes;
                $keys ['anio']=$anio;
                $forUpdate['cantidad']=$ultima_lectura;
                $forUpdate['f_lectura']=date('Y-m-d');
                $this-> replace($keys,$forUpdate);
                /*
                $sql = "REPLACE INTO lecturas (id_con,mes,anio,cantidad,f_lectura) VALUES ({$v['id']},$mes,$anio,$ultima_lectura,'" . date('Y-m-d') . "')";
                $this->query($sql);*/
                
            }
        }

    }


   
   
}  




